package com.numberone.iotplatform.controller;

import com.numberone.iotplatform.dto.ScanRequestDTO;
import com.numberone.iotplatform.dto.ScanStatus;
import com.numberone.iotplatform.service.DeviceScanService;
import com.numberone.iotplatform.service.impl.DeviceScanServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 设备扫描任务的RESTful API控制器。
 */
@RestController
@RequestMapping("/devices/scans")
@PreAuthorize("hasRole('ADMIN')") // 只有管理员才能执行扫描任务
public class DeviceScanController {

    @Autowired
    private DeviceScanService deviceScanService;

    /**
     * POST /api/devices/scans
     * 创建并启动一个新的设备扫描任务。
     *
     * @param request 包含扫描参数的请求体
     * @return 包含唯一任务ID的响应
     */
    @PostMapping
    public ResponseEntity<?> createScanTask(@Valid @RequestBody ScanRequestDTO request) {
        // 1. 生成一个唯一的任务ID
        String taskId = UUID.randomUUID().toString();

        // 2. 在任务状态管理器中初始化此任务的状态
        //    (我们之前将任务状态Map定义在了ServiceImpl中)
        DeviceScanServiceImpl.scanTasks.put(taskId, new ScanStatus());

        // 3. 异步调用 Service 层的方法来执行实际的扫描逻辑
        //    这个调用会立即返回，不会阻塞当前HTTP请求线程
        deviceScanService.startScan(
                taskId,
                request.getIpRange(),
                request.getPort(),
                request.getUsername(),
                request.getPassword()
        );

        // 4. 立即将任务ID返回给前端，以便前端可以开始轮询或订阅WebSocket
        Map<String, String> response = Collections.singletonMap("taskId", taskId);
        return ResponseEntity.ok(response);
    }

    /**
     * GET /api/devices/scans/{taskId}
     * 获取指定扫描任务的当前状态和进度。
     *
     * @param taskId 任务的唯一ID
     * @return 包含任务状态信息的响应
     */
    @GetMapping("/{taskId}")
    public ResponseEntity<?> getScanTaskStatus(@PathVariable String taskId) {
        ScanStatus taskStatus = deviceScanService.getScanStatus(taskId);

        if (taskStatus == null) {
            // 如果任务ID不存在，返回 404 Not Found
            return ResponseEntity.notFound().build();
        }

        return ResponseEntity.ok(taskStatus);
    }

    // TODO: 后续可以添加其他接口，例如：
    // GET /discovered-devices (获取发现池列表)
    // POST /devices/batch-import (批量导入发现的设备)
}